home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / misc / VMM_src.lha / VMM / traphandler30.asm < prev    next >
Encoding:
Assembly Source File  |  1995-12-16  |  10.4 KB  |  304 lines

  1.                     INCLUDE   "exec/funcdef.i"
  2.                     INCLUDE   "exec/exec_lib.i"
  3.                     INCLUDE   "exec/execbase.i"
  4.                     INCLUDE   "exec/lists.i"
  5.                     INCLUDE   "exec/ports.i"
  6.                     INCLUDE   "exec/ables.i"
  7.                     IFD       DEBUG
  8.                     INCLUDE   "exec/semaphores.i"
  9.                     ENDC
  10.                     INCLUDE   "shared_defs.i"
  11.                     INCLUDE   "macros.i"
  12.  
  13. * $Id: traphandler30.asm,v 3.6 95/12/16 18:36:09 Martin_Apel Exp $
  14.  
  15.                     IFD       DYN_MMU_SETUP
  16.                     XDEF      _DynMMUTrap30
  17.                     ELSE
  18.                     XDEF      _TrapHandler30
  19.                     ENDC
  20.  
  21.                     XREF      _PageHandlerTask
  22.                     XREF      _VM_ManagerProcess
  23.                     XREF      _PageFaultSignal
  24.                     XREF      _OrigTrapHandler
  25.                     XREF      _Free
  26.                     XREF      _PageReq
  27.                     XREF      _VirtAddrStart
  28.                     XREF      _VirtAddrEnd
  29.                     XREF      _OrigWait
  30.  
  31.                     IFD       DYN_MMU_SETUP
  32.                     XREF      _InstallMapping
  33.                     XREF      _OrigDynMMUTrap
  34.                     ELSE
  35.                     XREF      _OrigTrapHandler
  36.                     ENDC
  37.  
  38.                     IFD       DEBUG
  39.                     XREF      _InstructionFaults
  40.                     XREF      _EnforcerHits
  41.                     ENDC
  42.  
  43.                     MACHINE   MC68030
  44.  
  45. * On the 68040, VMM and Enforcer work together, because they use the
  46. * same pagesize (4K). Then address 4 (pointer to ExecBase) is mapped
  47. * as invalid. Access faults to this address should be as quick as 
  48. * possible therefore.
  49. * On the 68030, VMM and Enforcer don't work together since they use
  50. * different pagesizes, thus making the speed argument for address 4
  51. * invalid.
  52.  
  53.  
  54. FRAME_A_SIZE_B      EQU       32                   ; Frame $A for page fault
  55. FRAME_A_SIZE_L      EQU       FRAME_A_SIZE_B/4     ; on instruction boundary
  56. FRAME_B_SIZE_B      EQU       92                   ; Frame $B for page fault
  57. FRAME_B_SIZE_L      EQU       FRAME_B_SIZE_B/4     ; during instruction
  58.  
  59. SAVED_REGS          REG       d0-d2/a0-a2/a6
  60. NUM_REGS            EQU       7
  61.  
  62.                     * Offsets into the stackframe
  63. OFFS_SR             EQU       $0
  64. OFFS_PC             EQU       $2
  65. OFFS_FRAME_ID       EQU       $6
  66. OFFS_SSW            EQU       $a
  67. OFFS_FA             EQU       $10
  68.  
  69.                     * Bit definitions
  70. SR_SV               EQU       5
  71.  
  72.                     SECTION   CODE
  73.  
  74.                     IFD       DYN_MMU_SETUP
  75. _DynMMUTrap30:
  76.                     ELSE
  77. _TrapHandler30:
  78.                     ENDC
  79.  
  80.                     movem.l   SAVED_REGS,-(sp)
  81.                     move.w    OFFS_FRAME_ID+NUM_REGS*4(sp),d0
  82.                     and.w     #$f000,d0
  83.                     cmp.w     #$A000,d0
  84.                     bne       NotShortFrame
  85.                     moveq     #FRAME_A_SIZE_L,d2
  86.                     bra       right_format
  87. NotShortFrame:      cmp.w     #$B000,d0
  88.                     bne       wrong_format
  89.                     moveq     #FRAME_B_SIZE_L,d2
  90.                     bra       right_format
  91.  
  92. NoVirtMem:
  93. wrong_format:       ; restore original stack setting
  94.                     IFD       DEBUG
  95.                     addq.l    #1,_EnforcerHits
  96.                     move.l    OFFS_FA+NUM_REGS*4(sp),d0
  97.                     PRINT_DEB "EnforcerHit occurred for address %lx",d0
  98.                     ENDC
  99.                     movem.l   (sp)+,SAVED_REGS
  100.  
  101.                     ; give it to the original handler
  102.                     IFD       DYN_MMU_SETUP
  103.                     move.l    _OrigDynMMUTrap,-(sp)
  104.                     ELSE
  105.                     move.l    _OrigTrapHandler,-(sp)
  106.                     ENDC
  107.                     rts
  108.  
  109.  
  110.                     * d2 contains the size of the used stack frame in 
  111.                     * longwords throughout the traphandler
  112.  
  113. right_format        move.l    OFFS_FA+NUM_REGS*4(sp),d0    ; FaultAddress
  114.                     IFND      DYN_MMU_SETUP
  115.                     IN_VM     d0,NoVirtMem
  116.                     ENDC
  117.  
  118. ValidAddr
  119. *                    PRINT_DEB "TRAP: Fault for task %lx",ThisTask(a6)
  120.  
  121.                     btst.b    #SR_SV,OFFS_SR+NUM_REGS*4(sp)
  122.                     beq       TrapFromUserMode
  123.  
  124. TrapFromSVMode:     PRINT_DEB "*** TRAP: Called from SV mode"
  125.  
  126.                     IFD       DEBUG
  127.                     PRINT_DEB "***: ThisTask = %lx",ThisTask(a6)
  128.                     moveq     #0,d0
  129.                     move.w    OFFS_SR+NUM_REGS*4(sp),d0
  130.                     PRINT_DEB "***: SR = %lx",d0
  131.                     move.l    OFFS_PC+NUM_REGS*4(sp),d0
  132.                     PRINT_DEB "***: PC = %lx",d0
  133.                     move.l    usp,a0
  134.                     PRINT_DEB "***: USP = %lx",a0
  135.                     move.l    4,a0
  136.                     PRINT_DEB "***: SysBase = %lx",a0
  137.                     PRINT_DEB "***: SSP = %lx",sp
  138.                     move.l    4,a6
  139.                     jmp       _LVOColdReboot(a6)
  140.                     ELSE
  141.                     bra       SVAlarm
  142.                     ENDC
  143.  
  144.                     ALIGN_LONG
  145.  
  146. TrapFromUserMode    * PRINT_DEB "TRAP: SV mode 1"
  147.  
  148.                     IFD       DEBUG
  149.  
  150.                     move.l    4,a6
  151.                     cmpi.b    #-1,IDNestCnt(a6)
  152.                     beq       DisableNotBroken
  153.                     PRINT_DEB "Disable broken"
  154. DisableNotBroken    cmpi.b    #-1,TDNestCnt(a6)
  155.                     beq       ForbidNotBroken
  156.  
  157.                     lea       _VirtMemSema,a0
  158.                     move.l    SS_OWNER(a0),d0
  159.                     cmp.l     ThisTask(a6),d0
  160.                     beq       ForbidNotBroken
  161. ForbidBroken        PRINT_DEB "Forbid broken"
  162. ForbidNotBroken     
  163.                     move.w    OFFS_SSW+NUM_REGS*4(sp),d0
  164.                     and.w     #$7,d0
  165.                     move.l    OFFS_FA+NUM_REGS*4(sp),a0
  166.                     cmpi.b    #2,d0
  167.                     bne       NoInstructionFault
  168. *                    PRINT_DEB "TRAP: Instruction fault at %lx",a0
  169.                     move.l    a0,-(sp)
  170. *                    jsr       _FindHunk
  171.                     add.w     #4,sp
  172.                     addq.l    #1,_InstructionFaults
  173. NoInstructionFault
  174.                     
  175.                     ENDC
  176.  
  177.                     lea       _Free,a0
  178.                     REMHEAD
  179.                     tst.l     d0
  180.                     move.l    d0,a2               ; does not affect CCR
  181.                     beq       SVAlarm
  182.  
  183.                     lea       TS_TmpStack+TMP_STACKSIZE(a2),a6
  184.                     move.l    usp,a0                        ; Store orig usp
  185.                     move.l    a0,-(a6)
  186.                     move.l    d2,d0
  187.                     lea       NUM_REGS*4(sp,d2.w*4),a1
  188.                     subq.w    #1,d0
  189. copy_frame:         move.l    -(a1),-(a6)
  190.                     dbra      d0,copy_frame
  191.  
  192.                     lea       NUM_REGS*4(sp),a1
  193.                     moveq     #NUM_REGS-1,d0
  194. copy_reglist        move.l    -(a1),-(a6)
  195.                     dbra      d0,copy_reglist
  196.  
  197.                     move.l    a6,usp
  198.  
  199.                     lea       NUM_REGS*4(sp,d2.w*4),sp ; destroy frame
  200.  
  201.                     andi.w    #$dfff,sr                     ; switch to
  202.                                                             ; user mode
  203.                     * Tmp stack format is now
  204.                     * high:  | orig_usp
  205.                     *        | stack frame
  206.                     * low:   | SAVED_REGS
  207.  
  208.  
  209. *                    PRINT_DEB "TRAP: User mode 1"
  210.  
  211.                     move.l    4,a6
  212.                     move.l    NUM_REGS*4+OFFS_FA(sp),TS_FaultAddress(a2)
  213. *                    PRINT_DEB "FaultAddress = %lx",TS_FaultAddress(a2)
  214.                     move.l    ThisTask(a6),TS_FaultTask(a2)
  215.  
  216.                     lea       NUM_REGS*4(sp),a1
  217.                     move.l    a1,TS_TopOfStackFrame(a2)
  218.  
  219.                     IFND      DYN_MMU_SETUP
  220.                     GET_SIGNAL
  221.                     ext.b     d0
  222.                     move.w    d0,TS_WakeupSignal(a2)
  223.  
  224.                     lea       _PageReq,a0
  225.                     move.l    a2,a1
  226.                     FORBID
  227.                     ADDTAIL
  228.                     PERMIT
  229.  
  230.                     move.w    _PageFaultSignal,d1
  231.                     moveq     #1,d0
  232.                     move.l    _PageHandlerTask,a1
  233.                     lsl.l     d1,d0
  234.                     jsr       _LVOSignal(a6)
  235.  
  236.                     moveq     #1,d0
  237.                     move.w    TS_WakeupSignal(a2),d1
  238.                     lsl.l     d1,d0
  239.  
  240. *                    PRINT_DEB "TRAP: User mode 2"
  241.  
  242.                     move.l    _OrigWait,a0
  243.                     jsr       (a0)            ; no need to go through patch
  244.  
  245.                     * Page is back
  246.  
  247. *                    PRINT_DEB "TRAP: User mode 3"
  248.  
  249.                     move.w    TS_WakeupSignal(a2),d0
  250.                     RELEASE_SIGNAL
  251.  
  252.                     ELSE      ; DYN_MMU_SETUP
  253.  
  254.                     move.l    TS_FaultAddress(a2),-(sp)
  255.                     jsr       _InstallMapping
  256.                     add.w     #4,sp
  257.  
  258.                     ENDC
  259.  
  260.                     move.l    TS_TopOfStackFrame(a2),a0
  261.  
  262.                     move.l    a5,-(sp)                 ; UserStack
  263.                     lea       PageIsBack(pc),a5
  264.                     jmp       _LVOSupervisor(a6)
  265.  
  266.  
  267.                     ALIGN_LONG
  268. PageIsBack:     *    PRINT_DEB "TRAP: SV mode 2"
  269.  
  270.                     add.w     #8,sp                    ; take Supervisor
  271.                     move.l    usp,a6                   ; stackframe from stack
  272.                     move.l    (a6)+,a5
  273.  
  274.                     ; copy stack frame from user stack
  275.                     move.l    d2,d0
  276.                     lea       NUM_REGS*4(a6,d2.w*4),a1
  277.                     subq.w    #1,d0
  278. copy_frame2:        move.l    -(a1),-(sp)
  279.                     dbra      d0,copy_frame2
  280.  
  281.                     move.l    NUM_REGS*4(a6,d2.w*4),a0  ; orig USP
  282.                     move.l    a0,usp
  283.  
  284.                     lea       _Free,a0
  285.                     move.l    a2,a1
  286.                     ADDTAIL
  287.  
  288. *                    PRINT_DEB "TRAP: SV mode 3"
  289.  
  290.                     movem.l   (a6),SAVED_REGS
  291.                     rte
  292.  
  293. ********************************************************************
  294.  
  295. SVAlarm:            PRINT_DEB "TRAP: SV alarm"
  296.                     move.l    4,a6
  297.                     move.l    #NoTrapStructsAlertNum,d7
  298.                     jmp       _LVOAlert(a6)
  299.                     
  300.  
  301. ********************************************************************
  302.  
  303.                    end
  304.